/**********************************************
* @file    	usart.h
* @author 	dralee
* @version	v1.0
* @date			2021-12-02
* @brief		串口1，中断方式，支持printf
*		UART1挂载到APB2总线，其它UART挂载到APB1总线
* @attention 通过定义USE_USART_NO_x，x:[1,2,3,4,5]
*		可定义对应串口宏
***********************************************/
#ifndef __USART_IRQ_H
#define __USART_IRQ_H

// 使用的串口几USE_USART_NO_x，x:[1,2,3,4,5]，如USART1，则USE_USART_NO_1

#define USE_USART_NO_1							// 使用串口1
//#define USE_USART_IRQ_RX						// 使用中断方式接收数据，启动中断，则不可使用getchar等查询方式，不然会错乱
#define USE_USART_IRQ_RX_SEND_BACK 	// 中断收到数据原样返回

#include "stm32f10x.h"
#include <stdio.h>

#ifdef USE_USART_IRQ_RX
#define	RX_BUFFER_SIZE							200								// 接收缓冲大小
extern uint8_t		USARTx_RX_Buffer[RX_BUFFER_SIZE];			// 接收数据buffer
extern uint16_t 	USARTx_RX_STA;
#endif

#ifdef USE_USART_NO_1
// USART1
#define		DBG_USARTx										USART1
#define		DBG_USART_CLK									RCC_APB2Periph_USART1
#define		DBG_USART_APBxClockCmd				RCC_APB2PeriphClockCmd
#define		DBG_USART_BAUDRATE						115200

// USART GPIO引脚
#define		DBG_USART_GPIO_CLK						(RCC_APB2Periph_GPIOA)
#define		DBG_USART_GPIO_APBxClockCmd		RCC_APB2PeriphClockCmd

#define		DBG_USART_TX_GPIO_PORT				GPIOA
#define		DBG_USART_TX_GPIO_PIN					GPIO_Pin_9
#define		DBG_USART_RX_GPIO_PORT				GPIOA
#define		DBG_USART_RX_GPIO_PIN					GPIO_Pin_10

#define 	DBG_USART_IRQ									USART1_IRQn
#define 	DBG_USART_IRQHandler					USART1_IRQHandler

#elif defined USE_USART_NO_2
// USART2
#define		DBG_USARTx										USART2
#define		DBG_USART_CLK									RCC_APB1Periph_USART2
#define		DBG_USART_APBxClockCmd				RCC_APB1PeriphClockCmd
#define		DBG_USART_BAUDRATE						115200

// USART GPIO引脚
#define		DBG_USART_GPIO_CLK						(RCC_APB2Periph_GPIOA)
#define		DBG_USART_GPIO_APBxClockCmd		RCC_APB2PeriphClockCmd

#define		DBG_USART_TX_GPIO_PORT				GPIOA
#define		DBG_USART_TX_GPIO_PIN					GPIO_Pin_2
#define		DBG_USART_RX_GPIO_PORT				GPIOA
#define		DBG_USART_RX_GPIO_PIN					GPIO_Pin_3

#define 	DBG_USART_IRQ									USART2_IRQn
#define 	DBG_USART_IRQHandler					USART2_IRQHandler

#elif defined USE_USART_NO_3
// USART3
#define		DBG_USARTx										USART3
#define		DBG_USART_CLK									RCC_APB1Periph_USART3
#define		DBG_USART_APBxClockCmd				RCC_APB1PeriphClockCmd
#define		DBG_USART_BAUDRATE						115200

// USART GPIO引脚
#define		DBG_USART_GPIO_CLK						(RCC_APB2Periph_GPIOB)
#define		DBG_USART_GPIO_APBxClockCmd		RCC_APB2PeriphClockCmd

#define		DBG_USART_TX_GPIO_PORT				GPIOB
#define		DBG_USART_TX_GPIO_PIN					GPIO_Pin_10
#define		DBG_USART_RX_GPIO_PORT				GPIOB
#define		DBG_USART_RX_GPIO_PIN					GPIO_Pin_11

#define 	DBG_USART_IRQ									USART3_IRQn
#define 	DBG_USART_IRQHandler					USART3_IRQHandler

#elif defined USE_USART_NO_4
// USART4
#define		DBG_USARTx										UART4
#define		DBG_USART_CLK									RCC_APB1Periph_UART4
#define		DBG_USART_APBxClockCmd				RCC_APB1PeriphClockCmd
#define		DBG_USART_BAUDRATE						115200

// USART GPIO引脚
#define		DBG_USART_GPIO_CLK						(RCC_APB2Periph_GPIOC)
#define		DBG_USART_GPIO_APBxClockCmd		RCC_APB2PeriphClockCmd

#define		DBG_USART_TX_GPIO_PORT				GPIOC
#define		DBG_USART_TX_GPIO_PIN					GPIO_Pin_10
#define		DBG_USART_RX_GPIO_PORT				GPIOC
#define		DBG_USART_RX_GPIO_PIN					GPIO_Pin_11

#define 	DBG_USART_IRQ									USART4_IRQn
#define 	DBG_USART_IRQHandler					USART4_IRQHandler

#else
// USART5
#define		DBG_USARTx										UART5
#define		DBG_USART_CLK									RCC_APB1Periph_UART5
#define		DBG_USART_APBxClockCmd				RCC_APB1PeriphClockCmd
#define		DBG_USART_BAUDRATE						115200

// USART GPIO引脚
#define		DBG_USART_GPIO_CLK						(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD)
#define		DBG_USART_GPIO_APBxClockCmd		RCC_APB2PeriphClockCmd

#define		DBG_USART_TX_GPIO_PORT				GPIOC
#define		DBG_USART_TX_GPIO_PIN					GPIO_Pin_12
#define		DBG_USART_RX_GPIO_PORT				GPIOD
#define		DBG_USART_RX_GPIO_PIN					GPIO_Pin_2

#define 	DBG_USART_IRQ									UART5_IRQn
#define 	DBG_USART_IRQHandler					UART5_IRQHandler

#endif

void USART_Config(void);
void USART_SendByte(USART_TypeDef *USARTx, uint8_t ch);
void USART_SendString(USART_TypeDef *USARTx, char *str);
void USART_SendHalfWord(USART_TypeDef *USARTx, uint16_t ch);
uint8_t* USART_GetData(void);

#endif
